package fwmpc.service.impl;

import fwmpc.interact.IWeiXinInteraction;
import fwmpc.resource.IWeiXinAttributeItem;
import fwmpc.service.impl.basic.AbstractWeiXinBasicService;
import fwmpc.store.IWeiXinAttributeStore;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONObject;
import org.springframework.http.MediaType;

/**
 * 类描述:  微信基本常规信息处理Service抽象
 *
 * @author 王雷
 * @version 1.0.0
 * @date 2021/1/21 0021 下午 10:15
 */
@Slf4j
public abstract class AbstractWeiXinBasicGeneralInformationService extends AbstractWeiXinBasicService {

    /**
     * 功能描述：微信基本常规信息处理Service抽象
     *
     * @param iWeiXinInteraction    微信通讯配置对象
     * @param iWeiXinAttributeStore 微信属性存储对象
     * @author : 王雷
     * @date : 2021/1/21 0021 下午 10:19
     */
    public AbstractWeiXinBasicGeneralInformationService(IWeiXinInteraction iWeiXinInteraction
            , IWeiXinAttributeStore iWeiXinAttributeStore) {
        super(iWeiXinInteraction, iWeiXinAttributeStore);
    }

    private static final String GRANT_TYPE_VALUE = "authorization_code";

    /**
     * 功能描述：微信换取Access_token处理
     *
     * @param appId 标识
     * @param code  微信方获取的编码
     * @throws Exception 异常
     * @author : 王雷
     * @date : 2021/1/21 0021 上午 11:37
     */
    @Override
    public JSONObject giveTokenToOpenId(String appId, String code) throws Exception {
        final IWeiXinAttributeItem wxaItem = super.giveWeiXinAttributeItem(appId);
        //开始获取数据
        return iWeiXinInteraction.httpByGet(iWeiXinAttributeStore.giveAccessTokenUrl(), String.class, requestHeaders -> {
                    requestHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
                }
                , () -> null, parameter -> {
                    parameter.add("appid", wxaItem.giveAppId());
                    parameter.add("secret", wxaItem.giveAppSecret());
                    parameter.add("js_code", code);
                    parameter.add("grant_type", GRANT_TYPE_VALUE);
                }, reqeustValue -> {
                    log.debug("微信换取Access_token处理获取到的结果为：{}", reqeustValue);
                    return JSONObject.fromObject(reqeustValue);
                });
    }
}
